package ve.usb.ddp;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.codec.GifImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.ddp.hibernate.*;

import java.util.List;
import org.hibernate.HibernateException;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Properties;
import java.util.Set;
import javax.activation.DataHandler;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import ve.usb.cohesion.runtime.LocalDate;

/**
 * 
 */
public class AccionesCU005ManejoPAA extends CohesionAction {
    
/**
     * Called by Struts for the execution of action A_BuscarProfesorPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_BuscarProfesorPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAA", "A_Pre_ModificarProfesorPAA", "A_Pre_AgregarPAA", "A_Pre_ModificarPAA", "A_Pre_ObservacionesPAA", "A_Pre_RindioCuentas", "A_Pre_ConsultaAvanzadaPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;
        final int SALIDA_2 = 2;
        final int SALIDA_3 = 3;
        final int SALIDA_4 = 4;
        final int SALIDA_5 = 5;
        final int SALIDA_6 = 6;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_BuscarProfesor fF_BuscarProfesor = (F_BuscarProfesor)form;
            /*Comienza nuestro codigo*/
            int ci = fF_BuscarProfesor.getCi();
            List<Profesor> profs = s.createQuery("FROM Profesor prof WHERE prof.ci=:ci").setInteger("ci", fF_BuscarProfesor.getCi()).list();

            String vengoDe = (String) request.getSession().getAttribute("VENGO_DE");
            // ya no se necesita el atributo VENGO_DE
            //request.getSession().removeAttribute("VENGO_DE");

            if (vengoDe.equals("AGREGAR_REGISTRO")) {
                salida = SALIDA_2;
                request.getSession().setAttribute("VENGO_DE", "AGREGAR_REGISTRO");
                request.getSession().setAttribute("CI_PROF_BUSCAR", ci);
            } else if (vengoDe.equals("MODIFICAR_REGISTRO")) {
                if (!profs.isEmpty()) {
                    salida = SALIDA_3;
                    request.getSession().setAttribute("VENGO_DE", "MODIFICAR_REGISTRO");
                    request.getSession().setAttribute("CI_PROF_BUSCAR", ci);
                } else {
                    salida = SALIDA_0;
                }
            } else if (vengoDe.equals("MODIFICAR_PROFESOR")) {
                if (!profs.isEmpty()) {
                    salida = SALIDA_1;
                    request.getSession().setAttribute("VENGO_DE", "MODIFICAR_PROFESOR");
                    request.getSession().setAttribute("CI_PROF_BUSCAR", ci);
                } else {
                    salida = SALIDA_0;
                }
            } else if (vengoDe.equals("OBSERVACIONES")) {
                if (!profs.isEmpty()) {
                    salida = SALIDA_4;
                    request.getSession().setAttribute("VENGO_DE", "OBSERVACIONES");
                    request.getSession().setAttribute("CI_PROF_BUSCAR", ci);
                } else {
                    salida = SALIDA_0;
                }
            } else if (vengoDe.equals("RINDIO_CUENTAS")) {
                if (!profs.isEmpty()) {
                    salida = SALIDA_5;
                    request.getSession().setAttribute("VENGO_DE", "RINDIO_CUENTAS");
                    request.getSession().setAttribute("CI_PROF_BUSCAR", ci);
                } else {
                    salida = SALIDA_0;
                }
            } else if (vengoDe.equals("CONSULTA_AVANZADA")) {
                if (!profs.isEmpty()) {
                    salida = SALIDA_6;
                    request.getSession().setAttribute("VENGO_DE", "CONSULTA_AVANZADA");
                    request.getSession().setAttribute("CI_PROF_BUSCAR", ci);
                } else {
                    salida = SALIDA_0;
                }
            }
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_BuscarProfesorPAA.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ConsultaAvanzadaPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ConsultaAvanzadaPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ConsultaAvanzadaPAA","A_Pre_BuscarProfesorPAAConsultaAvanzada", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_pas, encargado_paa, encargado_prd, encargado_pai, director_DDP
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Comienza nuestro codigo*/
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            Profesor prof = (Profesor)s.createQuery("from Profesor prof where prof.ci=:ci").setInteger("ci", ci).uniqueResult();
            List<Paa> listPaa = s.createQuery("from Paa paa where paa.profesor.ci=:ci ORDER BY paa.fecha_inicio").setInteger("ci", ci).list();
            List<Integer> listMontoFinanPaa = new LinkedList<Integer>();
            List<Integer> listMontoReembPaa = new LinkedList<Integer>();
            int montoFinan = 0;
            int montoReembolso = 0;
            for(Paa paa : listPaa){
                paa.getUniversidad();
                int i = 0;
                int j = 0;
                for(PaaConceptosReebolso concepto : paa.getConceptos()){
                    montoReembolso += concepto.getMonto();
                    i += concepto.getMonto();
                }
                listMontoReembPaa.add(i);
                for(PaaFuenteFinanciamiento fuente : paa.getFuentes_financiamiento()){
                    montoFinan += fuente.getMonto();
                    j += fuente.getMonto();
                }
                listMontoFinanPaa.add(j);
            }
            if(listPaa.isEmpty()){
                salida = SALIDA_1;
            }
            request.getSession().setAttribute("prof", prof);
            request.getSession().setAttribute("montoFinan", montoFinan);
            request.getSession().setAttribute("montoReembolso", montoReembolso);
            request.getSession().setAttribute("L_Paa", listPaa);
            request.getSession().setAttribute("montosFinanPaa", listMontoFinanPaa);
            request.getSession().setAttribute("montosReembPaa", listMontoReembPaa);
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_ConsultaAvanzadaPAA.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_BuscarProfesorPAAConsultaAvanzada.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_BuscarProfesorPAAConsultaAvanzada(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, encargado_prd, encargado_pas, director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            request.getSession().setAttribute("VENGO_DE", "CONSULTA_AVANZADA");
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_GenerarPDFConsultaAvanzadaPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_GenerarPDFConsultaAvanzadaPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ConsultaAvanzadaPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_prd, encargado_paa, director_DDP, encargado_pas, encargado_pai
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            List<Paa> L_Paa = (List<Paa>)request.getSession()
                    .getAttribute("L_Paa");
            Profesor profs = (Profesor)request.getSession()
                    .getAttribute("prof");
            int montoReembolso = (Integer)request.getSession()
                    .getAttribute("montoReembolso");
            int montoFinan = (Integer)request.getSession()
                    .getAttribute("montoFinan");
            List<Integer> listMontoFinanPaa = (List<Integer>)request.getSession()
                    .getAttribute("montosFinanPaa");
            List<Integer> montosReembPaa = (List<Integer>)request.getSession()
                    .getAttribute("montosReembPaa");
             String nombrePDF = "PAA - Historia PAA del profesor "+profs.getPrimerNombre()+
                                 " "+profs.getSegundoNombre()+" "+profs.getPrimerApellido()+
                                 " "+profs.getSegundoApellido();
             String tituloPDF = "PAA - Historia PAA del profesor "+profs.getPrimerNombre()+
                                 " "+profs.getSegundoNombre()+" "+profs.getPrimerApellido()+
                                 " "+profs.getSegundoApellido();

             // Le indico al Servlet que voy a enviar un archivo pdf
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", " attachment; filename=\""+nombrePDF+".pdf\"");
            // Nuevo documento PDF con la pagina horizontal
            Document document = new Document(PageSize.LETTER.rotate());
            try {
                // Fuerzo al usuario a que descargue el archivo a su computador
                PdfWriter.getInstance(document, response.getOutputStream());
                document.open();

                //Seteo de la cebolla
                URL base = this.getClass().getResource("");
                String path = new File(base.getFile(), "/../../../../../css/images/Cebolla001tr.gif").getCanonicalPath();
                GifImage img = new GifImage(path);
                int frame_count = img.getFrameCount();
                for(int i = 1; i <= frame_count; i++){
                    document.add(img.getImage(i));
                }

                //Seteo Membrete
                document.add(new Paragraph("Universidad Simón Bolívar\nDepartamento de Desarrollo Profesoral\n" +
                                           "Programa Actualización Académica"));

                //Seteo el titulo y lo agrego al documento
                Paragraph title = new Paragraph(tituloPDF, FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
                title.setAlignment(Element.ALIGN_CENTER);
                title.setSpacingAfter(25);
                document.add(title);

                document.add(new Paragraph("Datos Personales"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos = new float[10];
                anchos[0] = 12;//Apellidos
                anchos[1] = 12;//Nombres
                anchos[2] = 9;//Cedula
                anchos[3] = 5;//Edad
                anchos[4] = 15;//Email
                anchos[5] = 10;//Categoria
                anchos[6] = 10;//Division
                anchos[7] = 13;//Departamen
                anchos[8] = 15;//Fecha ingresa USB
                anchos[9] = 10;//Novel

                //Creo la tabla
                PdfPTable table = new PdfPTable(10);
                table.setWidthPercentage(100);
                table.setWidths(anchos);

                //Anado los headers a la tabla
                table.addCell("Apellidos");
                table.addCell("Nombres");
                table.addCell("Cédula");
                table.addCell("Edad");
                table.addCell("Email");
                table.addCell("Categoría");
                table.addCell("División");
                table.addCell("Departamento");
                table.addCell("Fecha de ingreso USB");
                table.addCell("¿Es novel?");

                //Agrego los datos a la tabla
                table.addCell(profs.getPrimerApellido() + " " + profs.getSegundoApellido());//Apellidos
                table.addCell(profs.getPrimerNombre() + " " + profs.getSegundoNombre());//Nombres
                table.addCell(Integer.toString(profs.getCi()));//Cedula
                table.addCell(profs.getEdad());//Edad
                table.addCell(profs.getCorreo());//Email
                table.addCell(profs.getCategoria());//Categoria
                table.addCell(profs.getDivision());//Division
                table.addCell(profs.getDepartamento());//Departamento
                table.addCell(profs.getFec_Ing_USB().toString());//Fecha ingreso usb
                if(profs.getNovel()){
                    table.addCell("Si");
                }else{
                    table.addCell("No");
                }
                // Agrego la tabla creada al documento
                document.add(table);

                document.add(new Paragraph("Ubicación"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos1 = new float[4];
                anchos1[0] = 10;//Lapsos
                anchos1[1] = 10;//Pais
                anchos1[2] = 10;//Universidad
                anchos1[3] = 10;//Modalidad

                //Creo la tabla
                PdfPTable table1 = new PdfPTable(4);
                table1.setWidthPercentage(100);
                table1.setWidths(anchos1);

                //Anado los headers a la tabla
                table1.addCell("Lapso");
                table1.addCell("País");
                table1.addCell("Universidad");
                table1.addCell("Modalidad");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table1.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());//Lapso
                    table1.addCell(paa.getPais());//Pais
                    table1.addCell(paa.getUniversidad());//Universidad
                    table1.addCell(paa.getModalidad());//Universidad
                }
                // Agrego la tabla creada al documento
                document.add(table1);


                document.add(new Paragraph("Reembolso"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos2 = new float[5];
                anchos2[0] = 10;//Lapsos
                anchos2[1] = 10;//Requiere reembolso?
                anchos2[2] = 10;//Se reembolso?
                anchos2[3] = 10;//Concepto/Montos
                anchos2[4] = 10;//Montos total

                //Creo la tabla
                PdfPTable table2 = new PdfPTable(5);
                table2.setWidthPercentage(100);
                table2.setWidths(anchos2);

                //Anado los headers a la tabla
                table2.addCell("Lapso");
                table2.addCell("¿Requiere reembolso?");
                table2.addCell("¿Se le reembolso?");
                table2.addCell("Conceptos/Montos");
                table2.addCell("Total de Monto");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table2.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());//Lapso

                    //Defino las relaciones de tamano entre las columnas
                    float[] anchos3 = new float[2];
                    anchos3[0] = 10;//Concepto
                    anchos3[1] = 10;//Monto
                    //Creo la tabla
                    PdfPTable table3 = new PdfPTable(2);
                    table3.setWidthPercentage(100);
                    table3.setWidths(anchos3);

                    if(paa.getRequiere_reembolso()){
                        table2.addCell("Si");
                        if(paa.getSe_reembolso()){
                            table2.addCell("Si");
                        }else{
                            table2.addCell("No");
                        }
                        for(PaaConceptosReebolso concepto : paa.getConceptos()){
                            table3.addCell(concepto.getConcepto());//Concepto
                            table3.addCell(String.valueOf(concepto.getMonto())+"BsF.");//Monto
                        }
                        table2.addCell(table3);
                        table2.addCell(String.valueOf(montosReembPaa.get(i)));
                    }else{
                        table2.addCell("No");
                        table2.addCell("No hay información");
                        table2.addCell("No hay información");
                        table2.addCell("0Bs.F");
                    }
                }
                // Agrego la tabla creada al documento
                document.add(table2);
                document.add(new Paragraph("Total del montos reembolsados: "+String.valueOf(montoReembolso)+"Bs.F"));

                document.add(new Paragraph("Fuente de Financiamiento"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos3 = new float[4];
                anchos3[0] = 10;//Lapsos
                anchos3[1] = 10;//Tipo de financiamiento
                anchos3[2] = 10;//Fuente de financiamiento/Montos
                anchos3[3] = 10;//Total monto

                //Creo la tabla
                PdfPTable table3 = new PdfPTable(4);
                table3.setWidthPercentage(100);
                table3.setWidths(anchos3);

                //Anado los headers a la tabla
                table3.addCell("Lapso");
                table3.addCell("Tipo de Financiamiento");
                table3.addCell("Fuente de Financiamiento/Montos");
                table3.addCell("Total de Montos");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table3.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());
                    table3.addCell(paa.getTipo_financiamiento());

                    //Defino las relaciones de tamano entre las columnas
                    float[] anchos4 = new float[2];
                    anchos4[0] = 10;//Fuente financiamiento
                    anchos4[1] = 10;//Monto
                    //Creo la tabla
                    PdfPTable table4 = new PdfPTable(2);
                    table4.setWidthPercentage(100);
                    table4.setWidths(anchos4);
                    for(PaaFuenteFinanciamiento fuente : paa.getFuentes_financiamiento()){
                        table4.addCell(fuente.getFuente_financiamiento());//Fuente Financiamiento
                        table4.addCell(String.valueOf(fuente.getMonto())+"Bs.F");//Monto
                    }
                    table3.addCell(table4);
                    table3.addCell(String.valueOf(listMontoFinanPaa.get(i))+"Bs.F");

                }
                // Agrego la tabla creada al documento
                document.add(table3);
                document.add(new Paragraph("Total de montos financiados: "+String.valueOf(montoFinan)+"Bs.F"));

                document.add(new Paragraph("¿Rindió Cuentas?"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos5 = new float[3];
                anchos5[0] = 10;//Lapsos
                anchos5[1] = 10;//¿Rindió Cuentas?
                anchos5[2] = 10;//Fecha

                //Creo la tabla
                PdfPTable table5 = new PdfPTable(3);
                table5.setWidthPercentage(100);
                table5.setWidths(anchos5);

                //Anado los headers a la tabla
                table5.addCell("Lapso");
                table5.addCell("¿Rindió Cuentas?");
                table5.addCell("Fecha");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table5.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());
                    if(paa.getRindio_cuentas()){
                        table5.addCell("Si");
                        table5.addCell(paa.getFecha_rindio_cuentas().toString());
                    }else{
                        table5.addCell("No");
                        table5.addCell("No hay información");
                    }
                }
                document.add(table5);

                } catch (Exception ex) {
                throw ex;
            }
            document.close();
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_EnviarCorreoConsultaAvanzadaPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_EnviarCorreoConsultaAvanzadaPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_EnviarCorreoPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pas, encargado_prd, director_DDP, encargado_pai, encargado_paa
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            F_EnviarCorreo fF_EnviarCorreo = new F_EnviarCorreo();
            Usuario userCon = (Usuario)request.getSession().getAttribute("u_conectado");
            String correo = new String();
            correo = userCon.getCorreo();
            fF_EnviarCorreo.setAsunto("DDP - Consulta Avanzada PAA");
            fF_EnviarCorreo.setDestinatario(correo);
            request.getSession().setAttribute("F_EnviarCorreo", fF_EnviarCorreo);
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_EnviarCorreoPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_EnviarCorreoPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_prd, encargado_pas, encargado_paa, director_DDP, encargado_pai
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_EnviarCorreo fF_EnviarCorreo = (F_EnviarCorreo)form;
            /*Empieza nuestro codigo*/
            List<Paa> L_Paa = (List<Paa>)request.getSession()
                    .getAttribute("L_Paa");
            Profesor profs = (Profesor)request.getSession()
                    .getAttribute("prof");
            String nombrePDF = "PAA - Historia PAA del profesor "+profs.getPrimerNombre()+
                                 " "+profs.getSegundoNombre()+" "+profs.getPrimerApellido()+
                                 " "+profs.getSegundoApellido();
            int montoReembolso = (Integer)request.getSession()
                    .getAttribute("montoReembolso");
            int montoFinan = (Integer)request.getSession()
                    .getAttribute("montoFinan");
            List<Integer> listMontoFinanPaa = (List<Integer>)request.getSession()
                    .getAttribute("montosFinanPaa");
            List<Integer> montosReembPaa = (List<Integer>)request.getSession()
                    .getAttribute("montosReembPaa");
             
             String tituloPDF = "PAA - Historia PAA del profesor "+profs.getPrimerNombre()+
                                 " "+profs.getSegundoNombre()+" "+profs.getPrimerApellido()+
                                 " "+profs.getSegundoApellido();

            Document document = new Document(PageSize.LETTER.rotate());
            ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
            try {
                // Fuerzo al usuario a que descargue el archivo a su computador
                PdfWriter.getInstance(document, baosPDF);
                document.open();

                //Seteo de la cebolla
                URL base = this.getClass().getResource("");
                String path = new File(base.getFile(), "/../../../../../css/images/Cebolla001tr.gif").getCanonicalPath();
                GifImage img = new GifImage(path);
                int frame_count = img.getFrameCount();
                for(int i = 1; i <= frame_count; i++){
                    document.add(img.getImage(i));
                }

                //Seteo Membrete
                document.add(new Paragraph("Universidad Simón Bolívar\nDepartamento de Desarrollo Profesoral\n" +
                                           "Programa Actualización Académica"));

                //Seteo el titulo y lo agrego al documento
                Paragraph title = new Paragraph(tituloPDF, FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
                title.setAlignment(Element.ALIGN_CENTER);
                title.setSpacingAfter(25);
                document.add(title);

                document.add(new Paragraph("Datos Personales"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos = new float[10];
                anchos[0] = 12;//Apellidos
                anchos[1] = 12;//Nombres
                anchos[2] = 9;//Cedula
                anchos[3] = 5;//Edad
                anchos[4] = 15;//Email
                anchos[5] = 10;//Categoria
                anchos[6] = 10;//Division
                anchos[7] = 13;//Departamen
                anchos[8] = 15;//Fecha ingresa USB
                anchos[9] = 10;//Novel

                //Creo la tabla
                PdfPTable table = new PdfPTable(10);
                table.setWidthPercentage(100);
                table.setWidths(anchos);

                //Anado los headers a la tabla
                table.addCell("Apellidos");
                table.addCell("Nombres");
                table.addCell("Cédula");
                table.addCell("Edad");
                table.addCell("Email");
                table.addCell("Categoría");
                table.addCell("División");
                table.addCell("Departamento");
                table.addCell("Fecha de ingreso USB");
                table.addCell("¿Es novel?");

                //Agrego los datos a la tabla
                table.addCell(profs.getPrimerApellido() + " " + profs.getSegundoApellido());//Apellidos
                table.addCell(profs.getPrimerNombre() + " " + profs.getSegundoNombre());//Nombres
                table.addCell(Integer.toString(profs.getCi()));//Cedula
                table.addCell(profs.getEdad());//Edad
                table.addCell(profs.getCorreo());//Email
                table.addCell(profs.getCategoria());//Categoria
                table.addCell(profs.getDivision());//Division
                table.addCell(profs.getDepartamento());//Departamento
                table.addCell(profs.getFec_Ing_USB().toString());//Fecha ingreso usb
                if(profs.getNovel()){
                    table.addCell("Si");
                }else{
                    table.addCell("No");
                }
                // Agrego la tabla creada al documento
                document.add(table);

                document.add(new Paragraph("Ubicación"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos1 = new float[4];
                anchos1[0] = 10;//Lapsos
                anchos1[1] = 10;//Pais
                anchos1[2] = 10;//Universidad
                anchos1[3] = 10;//Modalidad

                //Creo la tabla
                PdfPTable table1 = new PdfPTable(4);
                table1.setWidthPercentage(100);
                table1.setWidths(anchos1);

                //Anado los headers a la tabla
                table1.addCell("Lapso");
                table1.addCell("País");
                table1.addCell("Universidad");
                table1.addCell("Modalidad");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table1.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());//Lapso
                    table1.addCell(paa.getPais());//Pais
                    table1.addCell(paa.getUniversidad());//Universidad
                    table1.addCell(paa.getModalidad());//Universidad
                }
                // Agrego la tabla creada al documento
                document.add(table1);


                document.add(new Paragraph("Reembolso"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos2 = new float[5];
                anchos2[0] = 10;//Lapsos
                anchos2[1] = 10;//Requiere reembolso?
                anchos2[2] = 10;//Se reembolso?
                anchos2[3] = 10;//Concepto/Montos
                anchos2[4] = 10;//Montos total

                //Creo la tabla
                PdfPTable table2 = new PdfPTable(5);
                table2.setWidthPercentage(100);
                table2.setWidths(anchos2);

                //Anado los headers a la tabla
                table2.addCell("Lapso");
                table2.addCell("¿Requiere reembolso?");
                table2.addCell("¿Se le reembolso?");
                table2.addCell("Conceptos/Montos");
                table2.addCell("Total de Monto");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table2.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());//Lapso

                    //Defino las relaciones de tamano entre las columnas
                    float[] anchos3 = new float[2];
                    anchos3[0] = 10;//Concepto
                    anchos3[1] = 10;//Monto
                    //Creo la tabla
                    PdfPTable table3 = new PdfPTable(2);
                    table3.setWidthPercentage(100);
                    table3.setWidths(anchos3);

                    if(paa.getRequiere_reembolso()){
                        table2.addCell("Si");
                        if(paa.getSe_reembolso()){
                            table2.addCell("Si");
                        }else{
                            table2.addCell("No");
                        }
                        for(PaaConceptosReebolso concepto : paa.getConceptos()){
                            table3.addCell(concepto.getConcepto());//Concepto
                            table3.addCell(String.valueOf(concepto.getMonto())+"BsF.");//Monto
                        }
                        table2.addCell(table3);
                        table2.addCell(String.valueOf(montosReembPaa.get(i)));
                    }else{
                        table2.addCell("No");
                        table2.addCell("No hay información");
                        table2.addCell("No hay información");
                        table2.addCell("0Bs.F");
                    }
                }
                // Agrego la tabla creada al documento
                document.add(table2);
                document.add(new Paragraph("Total del montos reembolsados: "+String.valueOf(montoReembolso)+"Bs.F"));

                document.add(new Paragraph("Fuente de Financiamiento"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos3 = new float[4];
                anchos3[0] = 10;//Lapsos
                anchos3[1] = 10;//Tipo de financiamiento
                anchos3[2] = 10;//Fuente de financiamiento/Montos
                anchos3[3] = 10;//Total monto

                //Creo la tabla
                PdfPTable table3 = new PdfPTable(4);
                table3.setWidthPercentage(100);
                table3.setWidths(anchos3);

                //Anado los headers a la tabla
                table3.addCell("Lapso");
                table3.addCell("Tipo de Financiamiento");
                table3.addCell("Fuente de Financiamiento/Montos");
                table3.addCell("Total de Montos");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table3.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());
                    table3.addCell(paa.getTipo_financiamiento());

                    //Defino las relaciones de tamano entre las columnas
                    float[] anchos4 = new float[2];
                    anchos4[0] = 10;//Fuente financiamiento
                    anchos4[1] = 10;//Monto
                    //Creo la tabla
                    PdfPTable table4 = new PdfPTable(2);
                    table4.setWidthPercentage(100);
                    table4.setWidths(anchos4);
                    for(PaaFuenteFinanciamiento fuente : paa.getFuentes_financiamiento()){
                        table4.addCell(fuente.getFuente_financiamiento());//Fuente Financiamiento
                        table4.addCell(String.valueOf(fuente.getMonto())+"Bs.F");//Monto
                    }
                    table3.addCell(table4);
                    table3.addCell(String.valueOf(listMontoFinanPaa.get(i))+"Bs.F");

                }
                // Agrego la tabla creada al documento
                document.add(table3);
                document.add(new Paragraph("Total de montos financiados: "+String.valueOf(montoFinan)+"Bs.F"));

                document.add(new Paragraph("¿Rindió Cuentas?"));

                //Defino las relaciones de tamano entre las columnas
                float[] anchos5 = new float[3];
                anchos5[0] = 10;//Lapsos
                anchos5[1] = 10;//¿Rindió Cuentas?
                anchos5[2] = 10;//Fecha

                //Creo la tabla
                PdfPTable table5 = new PdfPTable(3);
                table5.setWidthPercentage(100);
                table5.setWidths(anchos5);

                //Anado los headers a la tabla
                table5.addCell("Lapso");
                table5.addCell("¿Rindió Cuentas?");
                table5.addCell("Fecha");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Paa.size();i++) {
                    Paa paa = L_Paa.get(i);
                    table5.addCell(paa.getFecha_inicio().toString() + " - " + paa.getFecha_culminacion().toString());
                    if(paa.getRindio_cuentas()){
                        table5.addCell("Si");
                        table5.addCell(paa.getFecha_rindio_cuentas().toString());
                    }else{
                        table5.addCell("No");
                        table5.addCell("No hay información");
                    }
                }
                document.add(table5);

                } catch (Exception ex) {
                throw ex;
            }
            document.close();
            
            String destinatario = (String) fF_EnviarCorreo.getDestinatario();
            String asunto = (String) fF_EnviarCorreo.getAsunto();
            String mensaje = (String) fF_EnviarCorreo.getMensaje();

            //Remitente
            final String CORREO_REMITENTE = "notificacion.ddp@gmail.com";
            final String PASS_CORREO_REMITENTE = "ddponline";
            // Propiedades de la conexión
            Properties props = new Properties();
            props.setProperty("mail.smtp.host", "smtp.ldc.usb.ve");
            props.setProperty("mail.smtp.starttls.enable", "true");
            // Puerto de gmail para envio de correos
//            props.setProperty("mail.smtp.port", "587");
            // Nombre del usuario
            // property.
            props.setProperty("mail.smtp.user", CORREO_REMITENTE);
            // Definimos si se requiere o no usuario y password para conectarse
            props.setProperty("mail.smtp.auth", "true");

            props.setProperty("mail.smtp.ssl.trust", "false");
            // Preparamos la sesion
            javax.mail.Session session = javax.mail.Session.getDefaultInstance(props);







            // Construimos el mensaje
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(CORREO_REMITENTE));
            // Agregamos DESTINATARIO
            String[] correos = destinatario.split(",");
            for (int i = 0; i < correos.length; i++) {
                message.addRecipients(Message.RecipientType.TO, correos[i]);
            }
            // Seteamos ASUNTO
            message.setSubject(asunto);
            // Agregamos MENSAJE DE TEXTO O HTML
//            message.setText(mensaje);


            // create the message part
    MimeBodyPart messageBodyPart =
      new MimeBodyPart();

    //fill message
    messageBodyPart.setText(mensaje);

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // Part two is attachment
    messageBodyPart = new MimeBodyPart();
//    DataSource source = new FileDataSource(fileAttachment);
    messageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(baosPDF.toByteArray(), "application/pdf")));
    messageBodyPart.setFileName(nombrePDF+".pdf");
    multipart.addBodyPart(messageBodyPart);

    // Put parts in message
    message.setContent(multipart);




            // Especificamos el protocolo a usar, en nuestro caso smtp
            Transport t = session.getTransport("smtp");
            t.connect(CORREO_REMITENTE, PASS_CORREO_REMITENTE);
            //Transport.send(message);
            // Se envia el mensaje a todos lo destinatarios en el array Recipients
            t.sendMessage(message, message.getAllRecipients());
            // Cierre.
            t.close();




            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_EnviarCorreoPAA.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ModificarProfesorPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ModificarProfesorPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ModificarProfesorPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            Profesor prof = (Profesor) s.createQuery("from Profesor prof where prof.ci=:ci").setInteger("ci", ci).uniqueResult();
            F_DatosProfesor fF_DatosProfesor = new F_DatosProfesor();
            fF_DatosProfesor.setCategoria(prof.getCategoria());
            fF_DatosProfesor.setCi(prof.getCi());
            fF_DatosProfesor.setDepartamento(prof.getDepartamento());
            fF_DatosProfesor.setDivision(prof.getDivision());
            fF_DatosProfesor.setCorreo(prof.getCorreo());
            fF_DatosProfesor.setFecha_Ingreso_USB(prof.getFec_Ing_USB().toString());
            fF_DatosProfesor.setFecha_Nacimiento(prof.getFec_Nac().toString());
            fF_DatosProfesor.setNovel(prof.getNovel());
            fF_DatosProfesor.setPrimerApellido(prof.getPrimerApellido());
            fF_DatosProfesor.setPrimerNombre(prof.getPrimerNombre());
            fF_DatosProfesor.setSegundoApellido(prof.getSegundoApellido());
            fF_DatosProfesor.setSegundoNombre(prof.getSegundoNombre());

            request.getSession().setAttribute("F_DatosProfesor", fF_DatosProfesor);
            request.getSession().setAttribute("L_Categorias", prof.getCategoriasUSB());
            request.getSession().setAttribute("L_Divisiones", prof.getDivisionesUSB());
            request.getSession().setAttribute("L_Departamentos", prof.getDepartamentosUSB());
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_ModificarProfesorPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_ModificarProfesorPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAA", "V_ModificarProfesorPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_DatosProfesor fF_DatosProfesor = (F_DatosProfesor)form;
            /*Empieza nuestro codigo*/
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            Profesor prof = (Profesor) s.createQuery("from Profesor prof where prof.ci=:ci").setInteger("ci", ci).uniqueResult();
            prof.setCategoria(fF_DatosProfesor.getCategoria());
            prof.setCi(fF_DatosProfesor.getCi());
            prof.setDepartamento(fF_DatosProfesor.getDepartamento());
            prof.setDivision(fF_DatosProfesor.getDivision());
            prof.setCorreo(fF_DatosProfesor.getCorreo());

            //Chequeo de fechas
            if (fF_DatosProfesor.getFecha_Ingreso_USB().equals("")) {
                prof.setFec_Ing_USB(null);
            } else {
                prof.setFec_Ing_USB(new ve.usb.cohesion.runtime.LocalDate(fF_DatosProfesor.getFecha_Ingreso_USB()));
            }

            if (fF_DatosProfesor.getFecha_Nacimiento().equals("")) {
                prof.setFec_Nac(null);
            } else {
                prof.setFec_Nac(new ve.usb.cohesion.runtime.LocalDate(fF_DatosProfesor.getFecha_Nacimiento()));
            }

            prof.setNovel(fF_DatosProfesor.getNovel());
            prof.setPrimerApellido(fF_DatosProfesor.getPrimerApellido());
            prof.setPrimerNombre(fF_DatosProfesor.getPrimerNombre());
            prof.setSegundoApellido(fF_DatosProfesor.getSegundoApellido());
            prof.setSegundoNombre(fF_DatosProfesor.getSegundoNombre());
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ModificarProfesorPAA.msg0"));
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ModificarProfesorPAA.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_AgregarPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_AgregarPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_AgregarPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            // Extraigo el profesor encontrado en A_BuscarProfesorPAA
//            Profesor profesor = (Profesor) request.getSession().getAttribute("Profesor_buscado");
//            Paa UltimoPaa = getUltimoPaaDeProfesor(profesor);
            // UltimoPaa sera null si el profesor NO tiene paa activo para la fecha actual

            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            List<Profesor> profs = s.createQuery("from Profesor prof where prof.ci=:ci").setInteger("ci", ci).list();
            List<Object []> paas = (List<Object []>)s.createSQLQuery("SELECT paa.* " +
                                              "FROM \"public\".paa AS paa, Profesor profesor " +
                                              "WHERE paa.fecha_inicio = (SELECT MAX(paaAux.fecha_inicio) " +
                                                                        "FROM Paa paaAux, Profesor profesorAux " +
                                                                        "WHERE profesorAux.idProfesor = paaAux.profesor " +
                                                                          "AND profesorAux.ci =:ci) " +
                                                "AND CURRENT_DATE - paa.fecha_inicio <= 365 " +
                                                "AND profesor.idProfesor = paa.profesor " +
                                                "AND profesor.ci =:ci").setInteger("ci", ci).list();
            Profesor prof = new Profesor();
            F_RegistroPaa fF_RegistroPaa = new F_RegistroPaa();
            if (profs.size() == 1) {
                prof = profs.get(0);
                fF_RegistroPaa.setCategoria(prof.getCategoria());
                fF_RegistroPaa.setCi(prof.getCi());
                fF_RegistroPaa.setDepartamento(prof.getDepartamento());
                fF_RegistroPaa.setDivision(prof.getDivision());
                fF_RegistroPaa.setCorreo(prof.getCorreo());
                fF_RegistroPaa.setFecha_Ingreso_USB(prof.getFec_Ing_USB().toString());
                fF_RegistroPaa.setFecha_Nacimiento(prof.getFec_Nac().toString());
                fF_RegistroPaa.setNovel(prof.getNovel());
                fF_RegistroPaa.setPrimerApellido(prof.getPrimerApellido());
                fF_RegistroPaa.setPrimerNombre(prof.getPrimerNombre());
                fF_RegistroPaa.setSegundoApellido(prof.getSegundoApellido());
                fF_RegistroPaa.setSegundoNombre(prof.getSegundoNombre());
            } else {
                fF_RegistroPaa.setCi(ci);
            }
            request.getSession().setAttribute("F_RegistroPaa", fF_RegistroPaa);
            request.getSession().setAttribute("L_Divisiones", prof.getDivisionesUSB());
            request.getSession().setAttribute("L_Departamentos", prof.getDepartamentosUSB());
            request.getSession().setAttribute("L_Categorias", prof.getCategoriasUSB());
            request.getSession().setAttribute("L_Paises", fF_RegistroPaa.paisesLista());
            // TODO Enviar mensaje de Ultima_Actividad a la vista V_AgregarPAA.jsp
            if (!paas.isEmpty()){
                Object[] paa = paas.get(0);
                String msg = "El profesor " + prof.getPrimerNombre() +" " + prof.getPrimerApellido() +
                             " solicitó apoyo económico a través de este programa el día " + paa[4] +
                             " para hacer un(a) " + paa[3] + " en la Universidad " + paa[1] +
                             " de " + paa[2];
                request.setAttribute("msg", msg);
            }

            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ModificarPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ModificarPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ModificarPAA", "V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            List<Paa> listPaa = (List<Paa>) s.createQuery("from Paa paa where paa.fecha_culminacion >= CURRENT_DATE "
                    + "AND paa.profesor.ci=:ci").setInteger("ci", ci).list();
            F_RegistroPaa fF_RegistroPaa = new F_RegistroPaa();

            if (!listPaa.isEmpty()) {
                Paa paa = listPaa.get(0);
                Profesor prof = paa.getProfesor();
                fF_RegistroPaa.setCategoria(prof.getCategoria());
                fF_RegistroPaa.setCi(prof.getCi());
                fF_RegistroPaa.setDepartamento(prof.getDepartamento());
                fF_RegistroPaa.setDivision(prof.getDivision());
                fF_RegistroPaa.setCorreo(prof.getCorreo());
                fF_RegistroPaa.setFecha_Ingreso_USB(prof.getFec_Ing_USB().toString());
                fF_RegistroPaa.setFecha_Nacimiento(prof.getFec_Nac().toString());
                fF_RegistroPaa.setNovel(prof.getNovel());
                fF_RegistroPaa.setPrimerApellido(prof.getPrimerApellido());
                fF_RegistroPaa.setPrimerNombre(prof.getPrimerNombre());
                fF_RegistroPaa.setSegundoApellido(prof.getSegundoApellido());
                fF_RegistroPaa.setSegundoNombre(prof.getSegundoNombre());
                fF_RegistroPaa.setFecha_culminacion(paa.getFecha_culminacion().toString());
                fF_RegistroPaa.setFecha_inicio(paa.getFecha_inicio().toString());
                fF_RegistroPaa.setUniversidad(paa.getUniversidad());
                fF_RegistroPaa.setPais(paa.getPais());
                fF_RegistroPaa.setModalidad(paa.getModalidad());
                fF_RegistroPaa.setRequiere_reembolso(paa.getRequiere_reembolso());
//                fF_RegistroPaa.setRindio_cuentas(paa.getRindio_cuentas());
//                /*Seteo de la fecha de rendicion de cuentas*/
//                String html5 = "";
//                request.getSession().setAttribute("rindioCuentas", paa.getRindio_cuentas());
//                if(paa.getRindio_cuentas()){
//                    html5 = "<p>" +
//                            "<label for=\"885136\">Fecha cuando el profesor rindi&oacute; cuentas: </label>" +
//                            "<input type=\"text\" id=\"885136\" readonly=\"readonly\" value=\""+paa.getFecha_rindio_cuentas().toString()+"\" " +
//                            "size=\"10\" maxlength=\"10\" name=\"fecha_rindio_cuentas\">" +
//                            "<img onclick=\"scwShow(document.getElementById('885136'),event);\" alt=\"Calendario\" " +
//                            "src=\"../css/images/calendar_edit.png\">" +
//                            "</p>";
//                }
                /*Seteo de los reembolsos*/
                String html2 = "";
                String html3 = "";
                String html4 = "";
                int contador2 = 0;
                request.getSession().setAttribute("reqReembolso", paa.getRequiere_reembolso());
                if(paa.getRequiere_reembolso()){
                    Set<PaaConceptosReebolso> concetos = paa.getConceptos();
                    for(PaaConceptosReebolso concepto : concetos){
                        html2 += "<div id=\"nuevos_conceptos_"+contador2+"\">" +
                                   "<p>" +
                                   "<label>Concepto</label>" +
                                   "<input id=\"862235\" name=\"conceptos_a_reembolso\" value=\""+concepto.getConcepto()+"\" type=\"text\">" +
                                   "<label> Monto</label>" +
                                   "<input id=\"862235\" name=\"montos_a_reembolso\" value=\""+String.valueOf(concepto.getMonto())+"\" type=\"text\" size=\"13\">" +
                                   " <a onclick=\"eliminarCampo('nuevos_conceptos_"+contador2+"');\">Cancelar</a>" +
                                   "</p>" +
                                   "</div>";
                        contador2++;
                    }
                    html3 = "<p>" +
                    "<input type=\"button\" value=\"Agregar otro concepto\" class=\"button\" onclick=\"agregarConceptoMonto('campos_mas_conceptos',true,"+contador2+",'boton_mas_conceptos');\"/>"+
                    "</p>";
                    if(paa.getSe_reembolso()){
                        html4 = "<p id=\"862235_C\">" +
                                    "<label for=\"862235\">Se Reembols&oacute; el dinero al profesor?: </label>" +
                                    "Si<input id=\"862235\" type=\"radio\" value=\"true\" name=\"se_reembolso\" checked=\"checked\">" +
                                    "No<input id=\"862235\" type=\"radio\" value=\"false\" name=\"se_reembolso\">" +
                                 "</p>";
                    }else{
                        html4 = "<p id=\"862235_C\">" +
                                    "<label for=\"862235\">Se Reembols&oacute; el dinero al profesor?: </label>" +
                                    "Si<input id=\"862235\" type=\"radio\" value=\"true\" name=\"se_reembolso\">" +
                                    "No<input id=\"862235\" type=\"radio\" value=\"false\" name=\"se_reembolso\" checked=\"checked\">" +
                                 "</p>";
                    }
                }
                /*TODO Ajustar par usar nueva BD en fuentes y monto de financiamiento*/
                fF_RegistroPaa.setTipo_financiamiento(paa.getTipo_financiamiento());
                request.getSession().setAttribute("tipoFinan", paa.getTipo_financiamiento());
                String chosen = paa.getTipo_financiamiento();
                String html = "";
                String html1 = "";
                int contador = 0;
                for(PaaFuenteFinanciamiento fuente : paa.getFuentes_financiamiento()){
                    if(fuente.getFuente_financiamiento().equals("FONACIT")){
                        html += "<div id=\"nuevos_datos_"+contador+"\">" +
                                         "<p>" +
                                         "<label>Fuente de Financiamiento</label>" +
                                         "<select name=\"fuentes_de_financiamiento\" onchange=\"agregCampFuentFinan('nuevos_datos_"+contador+"','" + chosen +"',this.value,document.getElementById('campos'));\">" +
                                          "<option value=\"0\">Seleccione</option>" +
                                          "<option value=\"FONACIT\" selected=\"selected\">FONACIT</option>" +
                                          "<option value=\"DID\">DID</option>" +
                                          "<option value=\"DDP\">DDP</option>" +
                                          "<option value=\"Otros\">Otros</option>" +
                                         "</select>" +
                                         "<label>   Monto</label>" +
                                         "<input id=\"685083\" name=\"montos_a_financiar\" type=\"text\" size=\"13\" value=\""+String.valueOf(fuente.getMonto()) +"\">" +
                                         " <a onclick=\"eliminarCampo('nuevos_datos_"+contador+"');\">Cancelar</a>" +
                                        "</p>"+
                                        "</div>";
                        contador++;
                    }else if(fuente.getFuente_financiamiento().equals("DID")){
                        html += "<div id=\"nuevos_datos_"+contador+"\">" +
                                         "<p>" +
                                         "<label>Fuente de Financiamiento</label>" +
                                         "<select name=\"fuentes_de_financiamiento\" onchange=\"agregCampFuentFinan('nuevos_datos_"+contador+"','" + chosen +"',this.value,document.getElementById('campos'));\">" +
                                          "<option value=\"0\">Seleccione</option>" +
                                          "<option value=\"FONACIT\">FONACIT</option>" +
                                          "<option value=\"DID\" selected=\"selected\">DID</option>" +
                                          "<option value=\"DDP\">DDP</option>" +
                                          "<option value=\"Otros\">Otros</option>" +
                                         "</select>" +
                                         "<label>   Monto</label>" +
                                         "<input id=\"685083\" name=\"montos_a_financiar\" type=\"text\" size=\"13\" value=\""+String.valueOf(fuente.getMonto()) +"\">" +
                                         " <a onclick=\"eliminarCampo('nuevos_datos_"+contador+"');\">Cancelar</a>" +
                                        "</p>"+
                                        "</div>";
                        contador++;
                    }else if(fuente.getFuente_financiamiento().equals("DDP")){
                        html += "<div id=\"nuevos_datos_"+contador+"\">" +
                                         "<p>" +
                                         "<label>Fuente de Financiamiento</label>" +
                                         "<select name=\"fuentes_de_financiamiento\" onchange=\"agregCampFuentFinan('nuevos_datos_"+contador+"','" + chosen +"',this.value,document.getElementById('campos'));\">" +
                                          "<option value=\"0\">Seleccione</option>" +
                                          "<option value=\"FONACIT\">FONACIT</option>" +
                                          "<option value=\"DID\">DID</option>" +
                                          "<option value=\"DDP\" selected=\"selected\">DDP</option>" +
                                          "<option value=\"Otros\">Otros</option>" +
                                         "</select>" +
                                         "<label>   Monto</label>" +
                                         "<input id=\"685083\" name=\"montos_a_financiar\" type=\"text\" size=\"13\" value=\""+String.valueOf(fuente.getMonto()) +"\">" +
                                         " <a onclick=\"eliminarCampo('nuevos_datos_"+contador+"');\">Cancelar</a>" +
                                        "</p>" +
                                        "</div>";
                        contador++;
                    }else{
                        html+= "<div id=\"nuevos_datos_"+contador+"\">" +
                                "<p>" +
                                         "<label>Fuente de Financiamiento</label>" +
                                         "<select name=\"fuentes_de_financiamiento\" onchange=\"agregCampFuentFinan('nuevos_datos_"+contador+"','" + chosen +"',this.value,document.getElementById('datos_finanpaa_fuente'));\">" +
                                          "<option value=\"0\">Seleccione</option>" +
                                          "<option value=\"FONACIT\">FONACIT</option>" +
                                          "<option value=\"DID\">DID</option>" +
                                          "<option value=\"DDP\">DDP</option>" +
                                          "<option value=\"Otros\" selected=\"selected\">Otros</option>" +
                                         "</select>" +
                                         " <a onclick=\"eliminarCampo('nuevos_datos_"+contador+"');\">Cancelar</a>" +
                                         "</p>" +
                                         "<p>" +
                                         "<label>Nueva Fuente de Financiamiento</label>" +
                                         "<input id=\"685083\" name=\"nueva_fuentes_de_financiamiento\" type=\"text\" value=\""+fuente.getFuente_financiamiento()+"\">" +
                                         "<label>   Monto</label>" +
                                         "<input id=\"685083\" name=\"nueva_montos_a_financiar\" type=\"text\" size=\"13\" value=\""+String.valueOf(fuente.getMonto()) +"\">" +
                                        "</p>" +
                                        "</div>";
                        contador++;
                    }
                }
                html1 = "<p>" +
                    "<input type=\"button\" value=\"Agregar otro campo\" class=\"button\" onclick=\"nuevosCampoFinanzas('datos_finanpaa_fuente','boton_mas_campos','campos','"+chosen+"',"+contador+",true);\"/>"+
                    "</p>";
                request.setAttribute("html", html);
                request.setAttribute("html1", html1);
                request.setAttribute("html2", html2);
                request.setAttribute("html3", html3);
                request.setAttribute("html4", html4);
//                request.setAttribute("html5", html5);
                //fF_RegistroPaa.setFuente_financiamiento(paa.getFuente_financiamiento());
                //fF_RegistroPaa.setMonto_financiamiento(paa.getMonto_financiamiento());

                request.getSession().setAttribute("F_RegistroPaa", fF_RegistroPaa);
                request.getSession().setAttribute("L_Categorias", prof.getCategoriasUSB());
                request.getSession().setAttribute("L_Divisiones", prof.getDivisionesUSB());
                request.getSession().setAttribute("L_Departamentos", prof.getDepartamentosUSB());
                request.getSession().setAttribute("L_Paises", fF_RegistroPaa.paisesLista());
            } else {
                salida = SALIDA_1;
            }
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_ModificarPAA.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_AgregarPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_AgregarPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAA", "V_AgregarPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_RegistroPaa fF_RegistroPaa = (F_RegistroPaa)form;
            /* Empieza nuestro codigo */
            // Extraigo el profesor encontrado en A_BuscarProfesorPAA
            Profesor profesor;
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            List<Profesor> listProfs = (List<Profesor>) s.createQuery("from Profesor prof where prof.ci=:ci").setInteger("ci", ci).list();
            Paa paa = new Paa();
            if (listProfs.size() == 1) {
                profesor = listProfs.get(0);
            } else {
                profesor = new Profesor();
            }
            profesor.setCategoria(fF_RegistroPaa.getCategoria());
            profesor.setCi(fF_RegistroPaa.getCi());
            profesor.setCorreo(fF_RegistroPaa.getCorreo());
            profesor.setDepartamento(fF_RegistroPaa.getDepartamento());
            profesor.setDivision(fF_RegistroPaa.getDivision());

            //Chequeo de fechas
            if (fF_RegistroPaa.getFecha_Ingreso_USB().equals("")) {
                profesor.setFec_Ing_USB(null);
            } else {
                profesor.setFec_Ing_USB(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_Ingreso_USB()));
            }

            if (fF_RegistroPaa.getFecha_Nacimiento().equals("")) {
                profesor.setFec_Nac(null);
            } else {
                profesor.setFec_Nac(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_Nacimiento()));
            }

            profesor.setNovel(fF_RegistroPaa.getNovel());
            profesor.setPrimerApellido(fF_RegistroPaa.getPrimerApellido());
            profesor.setPrimerNombre(fF_RegistroPaa.getPrimerNombre());
            profesor.setSegundoApellido(fF_RegistroPaa.getSegundoApellido());
            profesor.setSegundoNombre(fF_RegistroPaa.getSegundoNombre());
//            paa.setProfesor(profesor);

            paa.setUniversidad(fF_RegistroPaa.getUniversidad());
            paa.setPais(fF_RegistroPaa.getPais());
            paa.setModalidad(fF_RegistroPaa.getModalidad());

            //Chequeo de fechas
            if (fF_RegistroPaa.getFecha_culminacion().equals("")) {
                paa.setFecha_culminacion(null);
            } else {
                paa.setFecha_culminacion(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_culminacion()));
            }
            if (fF_RegistroPaa.getFecha_inicio().equals("")) {
                paa.setFecha_inicio(null);
            } else {
                paa.setFecha_inicio(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_inicio()));
            }

            paa.setTipo_financiamiento(fF_RegistroPaa.getTipo_financiamiento());
            //set fuente y monto de financiamiento
            String[] fuentes_direc = fF_RegistroPaa.getFuentes_de_financiamiento();
            int tam = 0;
            for(int i = 0; i < fuentes_direc.length; i++){
                if(!fuentes_direc[i].equals("Otros")){
                    tam++;
                }
            }
            String[] fuentes_finan = new String[tam];
            int count0 = 0;
            for(int i = 0; i < fuentes_direc.length; i++){
                if(!fuentes_direc[i].equals("Otros")){
                    fuentes_finan[count0] = fuentes_direc[i];
                    count0++;
                }
            }
            String[] new_fuentes_Finan = fF_RegistroPaa.getNueva_fuentes_de_financiamiento();
            String[] montos_finan = fF_RegistroPaa.getMontos_a_financiar();
            String[] new_montos_finan = fF_RegistroPaa.getNueva_montos_a_financiar();
            int maxLength = fuentes_direc.length;
            int count1 = 0;
            int count2 = 0;
            int montoInt = 0;
            Set<PaaFuenteFinanciamiento> fuentesSet = new HashSet();
            PaaFuenteFinanciamiento[] fuentesArray= new PaaFuenteFinanciamiento[maxLength];
            for(int i = 0; i < maxLength; i++){
                PaaFuenteFinanciamiento paafuenFinan = new PaaFuenteFinanciamiento();
                if(fuentes_direc[i].equals("Otros")){
                    montoInt = Integer.parseInt(new_montos_finan[count2]);
                    paafuenFinan.setFuente_financiamiento(new_fuentes_Finan[count2]);
                    paafuenFinan.setMonto(montoInt);
                    paa.addToFuentes_financiamiento(paafuenFinan);
                    count2++;
                }else{
                    montoInt = Integer.parseInt(montos_finan[count1]);
                    paafuenFinan.setFuente_financiamiento(fuentes_finan[count1]);
                    paafuenFinan.setMonto(montoInt);
                    paa.addToFuentes_financiamiento(paafuenFinan);
                    count1++;
                }
            }

            paa.setRindio_cuentas(false);

            //Seteo de los reembolsos
            paa.setRequiere_reembolso(fF_RegistroPaa.getRequiere_reembolso());
            if(fF_RegistroPaa.getRequiere_reembolso()){
                String [] conceptosReembolso = fF_RegistroPaa.getConceptos_a_reembolso();
                String [] montosReembolso = fF_RegistroPaa.getmMontos_a_reembolso();
                for(int i = 0; i < fF_RegistroPaa.getConceptos_a_reembolso().length; i++){
                    PaaConceptosReebolso conceptoReembolso = new PaaConceptosReebolso();
                    conceptoReembolso.setConcepto(conceptosReembolso[i]);
                    conceptoReembolso.setMonto(Integer.parseInt(montosReembolso[i]));
                    paa.addToConceptos(conceptoReembolso);
                }
                paa.setSe_reembolso(fF_RegistroPaa.getSe_reembolso());
            }
            Observacion_Paa observacion = new Observacion_Paa();

            observacion.setFecha(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFechaObservacion()));
            observacion.setTexto(fF_RegistroPaa.getObservacion());

            // Creo las asociaciones entre los objetos
            observacion.setPaa(paa);
            paa.addToObservaciones(observacion);
            paa.setProfesor(profesor);
            profesor.addToPaa(paa);
            if (listProfs.size() == 1) {
                s.update(profesor);
                s.save(paa);
                s.save(observacion);
            } else {
                s.save(profesor);
                s.save(paa);
                s.save(observacion);
            }
            for (PaaFuenteFinanciamiento fuente : paa.getFuentes_financiamiento()){
                s.save(fuente);
            }
            for (PaaConceptosReebolso concepto : paa.getConceptos()){
                s.save(concepto);
            }
            s.flush();
            try {
                // Actualizo la base de datos
                s.update(paa);
                s.save(observacion);
                s.update(profesor);
                s.flush();
                // Salida para Agregar. Exitosa.
                salida = SALIDA_0;
                // Limpio el formulario
                fF_RegistroPaa.reset(mapping, request);
            } catch (HibernateException ex1) {
                // Ocurrio un problema al actualizar en la base de datos
                salida = SALIDA_1;
            }
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_AgregarPAA.msg0"));
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_AgregarPAA.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_ModificarPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_ModificarPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAA", "V_ModificarPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_RegistroPaa fF_RegistroPaa = (F_RegistroPaa)form;
            /* Empieza nuestro codigo */
            // Extraigo el PaaActivo encontrado en A_Pre_AgregarPAA
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            List<Profesor> listProfesores = (List<Profesor>) s.createQuery("from Profesor prof where prof.ci=:ci").setInteger("ci", ci).list();
            Paa paa = new Paa();
            Profesor profesor;

            profesor = listProfesores.get(0);
            profesor.setPrimerNombre(fF_RegistroPaa.getPrimerNombre());
            profesor.setSegundoNombre(fF_RegistroPaa.getSegundoNombre());
            profesor.setPrimerApellido(fF_RegistroPaa.getPrimerApellido());
            profesor.setSegundoApellido(fF_RegistroPaa.getSegundoApellido());
            profesor.setCi(fF_RegistroPaa.getCi());
            profesor.setFec_Nac(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_Nacimiento()));
            profesor.setCorreo(fF_RegistroPaa.getCorreo());
            profesor.setFec_Ing_USB(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_Ingreso_USB()));
            profesor.setNovel(fF_RegistroPaa.getNovel());
            profesor.setCategoria(fF_RegistroPaa.getCategoria());
            profesor.setDivision(fF_RegistroPaa.getDivision());
            profesor.setDepartamento(fF_RegistroPaa.getDepartamento());

            //Chequeo de fechas
            if (fF_RegistroPaa.getFecha_Ingreso_USB().equals("")) {
                profesor.setFec_Ing_USB(null);
            } else {
                profesor.setFec_Ing_USB(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_Ingreso_USB()));
            }
            if (fF_RegistroPaa.getFecha_Nacimiento().equals("")) {
                profesor.setFec_Nac(null);
            } else {
                profesor.setFec_Nac(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_Nacimiento()));
            }

            Paa paaUpdate = (Paa) s.createQuery("from Paa paa where paa.fecha_culminacion >= CURRENT_DATE "
                    + "AND paa.profesor.ci=:ci").setInteger("ci", profesor.getCi()).list().get(0);

            //Chequeo de fechas
            if (fF_RegistroPaa.getFecha_culminacion().equals("")) {
                paaUpdate.setFecha_culminacion(null);
            } else {
                paaUpdate.setFecha_culminacion(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_culminacion()));
            }
            if (fF_RegistroPaa.getFecha_inicio().equals("")) {
                paaUpdate.setFecha_inicio(null);
            } else {
                paaUpdate.setFecha_inicio(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_inicio()));
            }

//            /*Seteo de rendir cuentas*/
//            paaUpdate.setRindio_cuentas(fF_RegistroPaa.getRindio_cuentas());
//            if(fF_RegistroPaa.getRindio_cuentas()){
//                if (fF_RegistroPaa.getFecha_rindio_cuentas().equals("")) {
//                    paaUpdate.setFecha_rindio_cuentas(null);
//                } else {
//                    paaUpdate.setFecha_rindio_cuentas(new ve.usb.cohesion.runtime.LocalDate(fF_RegistroPaa.getFecha_rindio_cuentas()));
//                }
//            }

            /*TODO Ajustar para Usar nueva BD para fuente y monto de financiamiento*/
            paaUpdate.setModalidad(fF_RegistroPaa.getModalidad());
            paaUpdate.setPais(fF_RegistroPaa.getPais());
            paaUpdate.setTipo_financiamiento(fF_RegistroPaa.getTipo_financiamiento());
            //set fuente y monto de financiamiento
            String[] fuentes_direc = fF_RegistroPaa.getFuentes_de_financiamiento();
            List<PaaFuenteFinanciamiento> listFuentesFinan = (List<PaaFuenteFinanciamiento>) s.createQuery("from PaaFuenteFinanciamiento " +
                    "paaff where paaff.paa.id=:paaffId").setLong("paaffId", paaUpdate.getId()).list();
            for(PaaFuenteFinanciamiento fuenteOld : listFuentesFinan){                
                paaUpdate.removeFromFuentes_financiamiento(fuenteOld);
                s.delete(fuenteOld);
                s.flush();
            }
            int tam = 0;
            for(int i = 0; i < fuentes_direc.length; i++){
                if(!fuentes_direc[i].equals("Otros")){
                    tam++;
                }
            }
            String[] fuentes_finan = new String[tam];
            int count0 = 0;
            for(int i = 0; i < fuentes_direc.length; i++){
                if(!fuentes_direc[i].equals("Otros")){
                    fuentes_finan[count0] = fuentes_direc[i];
                    count0++;
                }
            }
            String[] new_fuentes_Finan = fF_RegistroPaa.getNueva_fuentes_de_financiamiento();
            String[] montos_finan = fF_RegistroPaa.getMontos_a_financiar();
            String[] new_montos_finan = fF_RegistroPaa.getNueva_montos_a_financiar();
            int maxLength = fuentes_direc.length;
            int count1 = 0;
            int count2 = 0;
            int montoInt = 0;
            for(int i = 0; i < maxLength; i++){
                PaaFuenteFinanciamiento paafuenFinan = new PaaFuenteFinanciamiento();
                if(fuentes_direc[i].equals("Otros")){
                    montoInt = Integer.parseInt(new_montos_finan[count2]);
                    paafuenFinan.setFuente_financiamiento(new_fuentes_Finan[count2]);
                    paafuenFinan.setMonto(montoInt);
                    paafuenFinan.setPaa(paaUpdate);
                    paaUpdate.addToFuentes_financiamiento(paafuenFinan);
                    count2++;
                }else{
                    montoInt = Integer.parseInt(montos_finan[count1]);
                    paafuenFinan.setFuente_financiamiento(fuentes_finan[count1]);
                    paafuenFinan.setMonto(montoInt);
                    paafuenFinan.setPaa(paaUpdate);
                    paaUpdate.addToFuentes_financiamiento(paafuenFinan);
                    count1++;
                }
            }
            //Seteo de los reembolsos
            List<PaaConceptosReebolso> listConceptos = (List<PaaConceptosReebolso>) s.createQuery("from PaaConceptosReebolso " +
                    "paac where paac.paa.id=:paacId").setLong("paacId", paaUpdate.getId()).list();
            for(PaaConceptosReebolso conceptoOld : listConceptos){
                paaUpdate.removeFromConceptos(conceptoOld);
                s.delete(conceptoOld);
                s.flush();
            }
            paaUpdate.setRequiere_reembolso(fF_RegistroPaa.getRequiere_reembolso());
            if(fF_RegistroPaa.getRequiere_reembolso()){
                String [] conceptosReembolso = fF_RegistroPaa.getConceptos_a_reembolso();
                String [] montosReembolso = fF_RegistroPaa.getmMontos_a_reembolso();
                for(int i = 0; i < fF_RegistroPaa.getConceptos_a_reembolso().length; i++){
                    PaaConceptosReebolso conceptoReembolso = new PaaConceptosReebolso();
                    conceptoReembolso.setConcepto(conceptosReembolso[i]);
                    conceptoReembolso.setMonto(Integer.parseInt(montosReembolso[i]));
                    paaUpdate.addToConceptos(conceptoReembolso);
                }
                paaUpdate.setSe_reembolso(fF_RegistroPaa.getSe_reembolso());
            }

            paaUpdate.setProfesor(profesor);
            paaUpdate.setUniversidad(fF_RegistroPaa.getUniversidad());

            profesor.addToPaa(paaUpdate);
            s.update(paaUpdate);
            s.update(profesor);
            for (PaaFuenteFinanciamiento fuente : paaUpdate.getFuentes_financiamiento()){
                s.save(fuente);
                s.flush();
            }
            for (PaaConceptosReebolso concepto : paaUpdate.getConceptos()){
                s.save(concepto);
                s.flush();
            }

            try {
                // Actualizo la base de datos
                s.update(profesor);
                s.update(paaUpdate);
                s.flush();
                // Salida para Modificar. Exitosa.
                salida = SALIDA_0;
                // Limpio el formulario
                fF_RegistroPaa.reset(mapping, request);
            } catch (HibernateException ex1) {
                // Ocurrio un problema al actualizar en la base de datos
                // Salida para Modificar. Fallida.
                salida = SALIDA_1;
            }
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ModificarPAA.msg0"));
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ModificarPAA.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ObservacionesPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ObservacionesPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ObservacionesPAA", "V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            F_Observacion fF_Observacion = new F_Observacion();
            fF_Observacion.setFechaObservacion(new LocalDate(new Date()).toString());
            List<Observacion_Paa> listObsPAA = (List<Observacion_Paa>) s.createQuery("from Observacion_Paa "
                    + "obspaa where obspaa.paa.fecha_culminacion >= CURRENT_DATE AND "
                    + "obspaa.paa.profesor.ci=:ci ORDER BY obspaa.fecha DESC").setInteger("ci", ci).list();
            List<Profesor> listProfesor = (List<Profesor>) s.createQuery("FROM Profesor WHERE ci="+ci).list();

            if (!listObsPAA.isEmpty()) {
                Paa paa = (Paa) listObsPAA.get(0).getPaa();
                for (Observacion_Paa obs : listObsPAA) {
                    obs.getFecha();
                    obs.getTexto();
                }
                salida = SALIDA_0;
                request.getSession().setAttribute("Profesor", listProfesor.get(0));
                request.getSession().setAttribute("L_Observaciones", listObsPAA);
                request.getSession().setAttribute("PAA_VIGENCIA", paa);
                request.getSession().setAttribute("F_Observacion", fF_Observacion);

            } else {
                salida = SALIDA_1;
            }
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_ObservacionesPAA.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_ObservarPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_ObservarPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_Observacion fF_Observacion = (F_Observacion)form;
            /*Empieza nuestro codigo*/
            int ci = (Integer)request.getSession().getAttribute("CI_PROF_BUSCAR");
             Paa paaVigencia = (Paa)s.createQuery("from Paa paa where paa.fecha_culminacion >= CURRENT_DATE " +
                        "AND paa.profesor.ci=:ci").setInteger("ci", ci).list().get(0);
            if(!fF_Observacion.getNuevaObservacion().equals("")){
                Observacion_Paa newObs = new Observacion_Paa();
                newObs.setFecha(new ve.usb.cohesion.runtime.LocalDate(fF_Observacion.getFechaObservacion()));
                newObs.setTexto(fF_Observacion.getNuevaObservacion());
                newObs.setPaa(paaVigencia);
                paaVigencia.addToObservaciones(newObs);
                s.save(newObs);
                s.update(paaVigencia);
                s.flush();
                fF_Observacion.reset(mapping, request);
            }
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ObservarPAA.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_BuscarProfesorPAAModificarProfesor.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_BuscarProfesorPAAModificarProfesor(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            request.getSession().setAttribute("VENGO_DE", "MODIFICAR_PROFESOR");
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_BuscarProfesorPAAAgregarRegistro.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_BuscarProfesorPAAAgregarRegistro(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            request.getSession().setAttribute("VENGO_DE", "AGREGAR_REGISTRO");
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_BuscarProfesorPAAModificarRegistro.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_BuscarProfesorPAAModificarRegistro(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            request.getSession().setAttribute("VENGO_DE", "MODIFICAR_REGISTRO");;
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_BuscarProfesorPAAObservaciones.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_BuscarProfesorPAAObservaciones(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_paa, director_DDP
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            request.getSession().setAttribute("VENGO_DE", "OBSERVACIONES");
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_BuscarProfesorPAARindioCuentas.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_BuscarProfesorPAARindioCuentas(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Empieza nuestro codigo*/
            request.getSession().setAttribute("VENGO_DE", "RINDIO_CUENTAS");
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_RindioCuentas.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_RindioCuentas(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_RindioCuentas", "A_Pre_RindioCuentas", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Comienza nuestro codigo*/
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            List<Object []> listPaaObject = (List<Object []>)s.createSQLQuery("SELECT paa.* " +
                                              "FROM \"public\".paa AS paa, Profesor profesor " +
                                              "WHERE paa.fecha_culminacion = (SELECT MAX(paaAux.fecha_culminacion) " +
                                                                        "FROM Paa paaAux, Profesor profesorAux " +
                                                                        "WHERE profesorAux.idProfesor = paaAux.profesor " +
                                                                          "AND profesorAux.ci =:ci) " +
                                                "AND profesor.idProfesor = paa.profesor " +
                                                "AND profesor.ci =:ci").setInteger("ci", ci).list();
            if(!listPaaObject.isEmpty()){
                request.getSession().setAttribute("CI_PROF_BUSCAR", ci);
                request.getSession().setAttribute("ID_PAA", Long.parseLong(listPaaObject.get(0)[0].toString()));
                Paa paa = new Paa();
                paa = (Paa)s.load(Paa.class, Long.parseLong(listPaaObject.get(0)[0].toString()));
                F_RindioCuentas fF_RindioCuentas = new F_RindioCuentas();
                request.getSession().setAttribute("rindCuentas", paa.getRindio_cuentas());
                if(paa.getRindio_cuentas()){
                    fF_RindioCuentas.setRindio_cuentas(paa.getRindio_cuentas());
                    String html = "<p>" +
                                 "<label for=\"887216\">Fecha cuando el profesor rindi&oacute; cuentas: </label>" +
                                 "<input type=\"text\" id=\"887216\" readonly=\"readonly\" value=\""+paa.getFecha_rindio_cuentas().toString()+"\" " +
                                 "size=\"10\" maxlength=\"10\" name=\"fecha_rindio_cuentas\">" +
                                 "<img onclick=\"scwShow(document.getElementById('887216'),event);\" alt=\"Calendario\" " +
                                 "src=\"../css/images/calendar_edit.png\">" +
                                 "</p>";
//                    fF_RindioCuentas.setFecha_rindio_cuentas(paa.getFecha_rindio_cuentas().toString());
                    request.setAttribute("html", html);
                    request.getSession().setAttribute("F_RindioCuentas", fF_RindioCuentas);
                }
            }else{
                salida = SALIDA_1;
            }
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_RindioCuentas.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_RendirCuentas.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_RendirCuentas(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_paa
            if (!CohesionActor.checkActor(request, 6)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_RindioCuentas fF_RindioCuentas = (F_RindioCuentas)form;
            /*Comienza nuestro codigo*/
            int ci = (Integer) request.getSession().getAttribute("CI_PROF_BUSCAR");
            Long paaId = (Long) request.getSession().getAttribute("ID_PAA");
            Paa paa = new Paa();
            paa = (Paa)s.load(Paa.class, paaId);
            paa.setRindio_cuentas(fF_RindioCuentas.getRindio_cuentas());
            if(fF_RindioCuentas.getRindio_cuentas()){
                paa.setFecha_rindio_cuentas(new ve.usb.cohesion.runtime.LocalDate(fF_RindioCuentas.getFecha_rindio_cuentas()));
            }else{
                paa.setFecha_rindio_cuentas(null);
            }
            s.update(paa);
            s.flush();
            fF_RindioCuentas.reset(mapping, request);
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_RendirCuentas.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }



public Paa getUltimoPaaDeProfesor(Profesor profesor) {
        Session s = HibernateUtil.getCurrentSession();
        List<Paa> paa_list = s.createQuery("FROM Paa paa WHERE paa.profesor="+profesor.getId()+" ORDER BY paa.fecha_culminacion DESC").list();
        if (paa_list.size() != 0) {
            return paa_list.get(0);
        }
        // Retorna null en caso de que no haya registro de PAA para el profesor
        return null;
    }

}